package com.example.orderservice.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import com.example.orderservice.annotation.AutoFill;
import com.example.orderservice.common.OperationType;
import com.example.orderservice.domain.entity.Good;
import com.example.orderservice.domain.entity.Order;
import com.example.orderservice.domain.entity.coupon;
import com.example.orderservice.domain.entity.item;
import com.example.orderservice.domain.vo.pointVo;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;


/**
 * 订单数据访问接口
 * 提供订单相关的数据库操作方法
 *
 * @author czwa
 */
@Mapper
public interface OrderMapper extends BaseMapper<Order> {

   /**
    * 检查商品库存
    *
    * @param items 订单明细项列表
    * @return 库存不足的商品列表
    */
   List<item> checkStock(item[] items);

   /**
    * 批量扣减商品库存
    *
    * @param items 订单明细项列表
    */
   void batchDeductStock(item[] items);

   /**
    * 保存订单信息（自动填充公共字段）
    *
    * @param order 订单实体
    */
   @AutoFill(OperationType.INSERT)
   void saveOrder(Order order);

   /**
    * 添加订单商品关联记录
    *
    * @param items   订单明细项列表
    * @param orderId 订单ID
    */
   void addOrderToGoods(item[] items, Integer orderId);

   /**
    * 获取用户所有订单
    *
    * @param currentId 用户ID
    * @return 订单列表（按创建时间倒序）
    */
   @Select("select id,information,expend,create_time,status from orders where user_id = #{currentId} order by create_time desc")
   List<Order> getAllOrder(Integer currentId);

   /**
    * 获取用户未支付订单
    *
    * @param currentId 用户ID
    * @return 未支付订单列表（按创建时间倒序）
    */
   @Select("select id,information,expend,create_time,status from orders where user_id = #{currentId} and status = 0 order by create_time desc")
   List<Order> getNoPaidOrder(Integer currentId);

   /**
    * 获取用户已处理订单
    *
    * @param currentId 用户ID
    * @return 已处理订单列表（按创建时间倒序）
    */
   @Select("select id,information,expend,create_time,status from orders where user_id = #{currentId} and status = 3 order by create_time desc")
   List<Order> getProcessedOrder(Integer currentId);

   /**
    * 获取用户已取消订单
    *
    * @param currentId 用户ID
    * @return 已取消订单列表（按创建时间倒序）
    */
   @Select("select id,information,expend,create_time,status from orders where user_id = #{currentId} and status = 2 order by create_time desc")
   List<Order> getCanceledOrder(Integer currentId);

   /**
    * 更新订单状态为已支付
    *
    * @param id 订单ID
    */
   @Update("update orders set status = 1 where id = #{id}")
   void payOrder(int id);

   /**
    * 更新用户余额
    *
    * @param expend 消费金额
    * @param userId 用户ID
    * @return 受影响行数
    */
   int updateUserBalance(double expend, int userId);

   /**
    * 根据订单ID获取商品列表
    *
    * @param id 订单ID
    * @return 商品列表
    */
   @Select("select g.id as id,og.consume as stock from order_good og left join good g on og.good_id = g.id where og.order_id=#{id}")
   List<Good> getGoodsByOrderId(int id);

   /**
    * 更新商品库存
    *
    * @param goods 商品列表
    */
   void updateGoodStock(List<Good> goods);

   /**
    * 更新优惠券使用状态
    *
    * @param uid 优惠券订单ID
    */
   @Update("update coupon_order set status = 2 where id=#{uid}")
   void updateCouponStatus(int uid);

   /**
    * 根据ID获取优惠券信息
    *
    * @param couponId 优惠券ID
    * @return 优惠券实体
    */
   @Select("select min_amount,`value`,status from coupon where id = #{couponId}")
   coupon getCouponById(Integer couponId);

   /**
    * 增加用户积分和经验值
    *
    * @param pointVo 包含用户ID和积分值的VO
    */
   @Update("update user set point = point + #{point},exp =exp +#{point} where id = #{userId}")
   void addPoint(pointVo pointVo);

   /**
    * 检查用户经验值是否足够升级
    *
    * @param userId 用户ID
    * @return 升级操作影响行数（0表示未升级，1表示成功升级）
    */
   @Update("update user set exp = exp - 1000,level = level + 1 where id = #{userId} and exp>=1000")
   int checkExp(Integer userId);

   /**
    * 发放等级奖励优惠券
    *
    * @param userId   用户ID
    * @param couponId 优惠券ID
    */
   @Insert("insert into coupon_order(user_id,coupon_id) values(#{userId},#{couponId})")
   void addLevelCoupon(Integer userId, int couponId);
}